package com.ssm.controller;

import com.ssm.security.MyUserDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Used to service account requests.
 * 
 * @author Mularien
 */
@Controller
public class AccountController extends BaseController {
	@Autowired
	private MyUserDetailService  changePasswordDao;
	
	@RequestMapping("/header.do")
	public void accountHome() {
	}
	@RequestMapping(value="/changePassword.do",method= RequestMethod.GET)
	public void showChangePasswordPage() {		
	}

	/**
	 * 业务接口方法定义添加一个简单的注解来实现@PreAuthorize,以保证用户在修改密码前已经作为系统的合法用户进行了登录	用户试图修改的必须是自己的密码，或者
	 	用户是管理员
	 * @param newPassword
	 * @param oldpassword
	 * @return
	 */
	@PreAuthorize("#username == principal.username or hasRole('ROLE_ADMIN')")
	@RequestMapping(value="/changePassword.do",method=RequestMethod.POST)
	public String submitChangePasswordPage(@RequestParam("password") String newPassword,@RequestParam("oldpassword") String oldpassword) {

		Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

		String username = principal.toString();
		if (principal instanceof UserDetails) {
		  username = ((UserDetails)principal).getUsername();
		}

		changePasswordDao.changePassword(oldpassword, newPassword);
		//SecurityContextHolder.clearContext();//是否删除Context决定着用户是否需要在进行登录一次

		return "header";
	}

	/**
	 * 获取所有线上用户与其最后一次登录时间
	 * 先判断该用户是否有最后一次登录的记录， 若没有则存入当前的登录时间
	 * 若有最后一次登录的记录，则检查当期那的时间是不是最新的登录时间，不是则更新
	 * 当security关闭session后，该方法不适用
	 * @param model
	 */
/*	@RequestMapping("/listActiveUsers.do")
	public void listActiveUsers(Model model){
		Map<Object,Date> lastActiveDates = new HashMap<>();
		for (Object principal:sessionRegistry.getAllPrincipals()){
			for (SessionInformation session: sessionRegistry.getAllSessions(principal,false)) {
				if (lastActiveDates.get(principal) == null) {
					lastActiveDates.put(principal,session.getLastRequest());
				}else {
					Date prevLastRequest = lastActiveDates.get(principal);
					if (session.getLastRequest().after(prevLastRequest)){
						lastActiveDates.put(principal,session.getLastRequest());
					}
				}
			}
		}
		model.addAttribute("activeUsers",lastActiveDates);
	}*/


}
/*listActiveUsers中使用了 SessionRegistry 的两个 API。
	getAllPrincipals ：返回拥有活跃 session   的 Principal  对象（典型情况下为UserDetails 对象）所组成的List；
	getAllSessions(principal, includeExpired)：得到指定Principal 的SessionInformation组成的 List，包含了每个 session 的信息。也能够包含过期的 session。
*/